﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{

    public class GerenciadorProduto
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorProduto()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorProduto(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(ProdutoModel produtoModel)
        {
            TB_PRODUTO produtoE = new TB_PRODUTO();
            Atribuir(produtoModel, produtoE);
            unitOfWork.RepositorioProduto.Inserir(produtoE);
            unitOfWork.Commit(shared);
            return produtoE.id_produto;
        }


        public void Editar(ProdutoModel produtoModel)
        {
            TB_PRODUTO produtoE = new TB_PRODUTO();
            Atribuir(produtoModel, produtoE);
            unitOfWork.RepositorioProduto.Editar(produtoE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idProduto)
        {
            unitOfWork.RepositorioProduto.Remover(produto => produto.id_produto.Equals(idProduto));
            unitOfWork.Commit(shared);

        }

        private IQueryable<ProdutoModel> GetQuery()
        {
            IQueryable<TB_PRODUTO> tb_produto = unitOfWork.RepositorioProduto.GetQueryable();
            var query = from produto in tb_produto
                        orderby (produto.descricao)
                        select new ProdutoModel
                        {
                            Id_Produto = produto.id_produto,
                            Id_Empresa = produto.id_empresa,
                            Id_Segmento = produto.id_segmento,
                            Id_subproduto = produto.id_subproduto,
                            NomeSegmento = produto.TB_SEGMENTO.descricao,
                            Nomesubproduto = produto.TB_SUBPRODUTO.descricao,
                            Descricao = produto.descricao,
                            Valor = produto.valor,
                            NomeEmpresa = produto.TB_EMPRESA.nome
                        };
            return query;
        }

        public IQueryable<ProdutoModel> ObterTodosByEmpresa(int id_empresa)
        {
            return GetQuery().Where(produto => produto.Id_Empresa.Equals(id_empresa));
        }


        public IEnumerable<ProdutoModel> ObterTodos()
        {
            return GetQuery();
        }

        public ProdutoModel Obter(int idProduto)
        {
            IEnumerable<ProdutoModel> produtoEs = GetQuery().Where(produtoModel => produtoModel.Id_Produto.Equals(idProduto));
            return produtoEs.ElementAtOrDefault(0);
        }


        private void Atribuir(ProdutoModel produtoModel, TB_PRODUTO produtoE)
        {
            produtoE.id_produto = produtoModel.Id_Produto;
            produtoE.id_empresa = produtoModel.Id_Empresa;
            produtoE.id_segmento = produtoModel.Id_Segmento;
            produtoE.id_subproduto = produtoModel.Id_subproduto;
            produtoE.valor = produtoModel.Valor;
            produtoE.descricao = produtoModel.Descricao;
        }
    }
}
